package com.hsnn.medstgmini.trading.pur.controller;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Type;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hsnn.medstgmini.Constants;
import com.hsnn.medstgmini.base.dict.model.form.DicAreaForm;
import com.hsnn.medstgmini.base.dict.service.DicAreaManager;
import com.hsnn.medstgmini.base.std.model.HospInfo;
import com.hsnn.medstgmini.base.std.model.StdCompinfo;
import com.hsnn.medstgmini.sys.model.SysUser;
import com.hsnn.medstgmini.trading.pur.model.PurAoginfo;
import com.hsnn.medstgmini.trading.pur.model.ReturnOrder;
import com.hsnn.medstgmini.trading.pur.model.form.ReturnDrugForm;
import com.hsnn.medstgmini.trading.pur.service.PurReturnOrderManager;
import com.hsnn.medstgmini.util.Pagination;
import com.hsnn.medstgmini.util.ParseNumber;
import com.hsnn.medstgmini.validator.ValidatorUtil;

@Controller
@RequestMapping("/purReturnOrder")
public class PurReturnOrderController {
	private static final Logger log = Logger
			.getLogger(PurReturnOrderController.class);

	@Autowired
	private PurReturnOrderManager purReturnOrderManager;

	@Autowired
	private DicAreaManager dicAreaManager;

	@Autowired
	private HttpServletRequest request;

	@Autowired
	private HttpSession session;
	
	/**
	 * @category 获取当前登陆人信息
	 * @date 2015年6月14日
	 * @return
	 */
	public SysUser getUser() {
		return (SysUser) session.getAttribute(Constants.USERINFO);
	}

	@Value("#{sysProp['system.province']}")
	private String sysProvince;

	/**
	 * @category 跳转至退货订单[中心端]
	 * @date 2015年7月14日
	 * @return
	 */
	@RequestMapping("/toReturnOrder")
	public String toReturnOrder() {
		DicAreaForm area = dicAreaManager.getDicAreaById(sysProvince);
		request.setAttribute("area", area);
		request.setAttribute("sysAreaId", sysProvince);
		return "/trading/pur/returnOrder";
	}
	/**
	 * @category 跳转至退货订单[生产企业端]
	 * @date 2015年7月14日
	 * @return
	 */
	@RequestMapping("/toProCompReturnOrder")
	public String toProCompReturnOrder() {
		DicAreaForm area = dicAreaManager.getDicAreaById(sysProvince);
		request.setAttribute("area", area);
		request.setAttribute("sysAreaId", sysProvince);
		return "/trading/pur/proCompReturnOrder";
	}
	/**
	 * @category 跳转至退货订单明细[中心端]
	 * @date 2015年7月14日
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	@RequestMapping("/toReturnOrderDetail")
	public String toReturnOrderDetail() throws UnsupportedEncodingException {
		request.setAttribute("retCode",request.getParameter("retCode"));
		request.setAttribute("hospName",URLDecoder.decode(request.getParameter("hospName"), "utf-8"));
		request.setAttribute("compName",URLDecoder.decode(request.getParameter("compName"), "utf-8"));
		return "/trading/pur/returnOrderDetail";
	}
	/**
	 * @category 跳转至退货订单明细[生产企业端]
	 * @date 2015年7月14日
	 * @return
	 * @throws UnsupportedEncodingException 
	 */
	@RequestMapping("/toProCompReturnOrderDetail")
	public String toProCompReturnOrderDetail() throws UnsupportedEncodingException {
		request.setAttribute("retCode",request.getParameter("retCode"));
		request.setAttribute("hospName",URLDecoder.decode(request.getParameter("hospName"), "utf-8"));
		request.setAttribute("compName",URLDecoder.decode(request.getParameter("compName"), "utf-8"));
		return "/trading/pur/proCompReturnOrderDetail";
	}

	/**
	 * @category 获取退货订单数据[中心端]
	 * @date 2015年7月14日
	 * @return
	 */
	@RequestMapping("/getReturnOrderList")
	@ResponseBody
	public Pagination getReturnOrderList(ReturnOrder returnOrder) {
		log.info("enter getReturnOrderList method");
		Pagination page = new Pagination(request);
		try {
			page.setForm(returnOrder);
			page = purReturnOrderManager.getReturnOrderList(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
		}
		return page;
	}
	/**
	 * @category 获取退货订单数据[生产企业]
	 * @date 2015年7月14日
	 * @return
	 */
	@RequestMapping("/getProCompReturnOrderList")
	@ResponseBody
	public Pagination getProCompReturnOrderList(ReturnOrder returnOrder) {
		log.info("enter getProCompReturnOrderList method");
		Pagination page = new Pagination(request);
		SysUser user = getUser();
		try {
			StdCompinfo compInfo = user.getInfo();
			returnOrder.setCompCode(compInfo.getCompCode());
			page.setForm(returnOrder);
			page = purReturnOrderManager.getProCompReturnOrderList(page);
			page.setSuccess(true);
		} catch (Exception e) {
			log.error("",e);
		}
		return page;
	}
	/**
	 * 
	 * @category 跳向退货计划页面
	 * @author 韩守松
	 * @date 2015年11月30日 
	 * @return
	 */
	@RequestMapping("/toReturnDrugApply")
	public String toReturnDrugApply() {
		return "/trading/pur/returnDrugApply";
	}

	/**
	 * 
	 * @category 获取可退货商品数据（医疗机构）
	 * @author 韩守松
	 * @date 2015年11月30日 
	 * @param page
	 * @return
	 */
	@RequestMapping("/getReturnDrugApplyDataList")
	@ResponseBody
	public Pagination getReturnDrugApplyDataList(ReturnDrugForm form) {
		log.info("获取可退货商品数据（医疗机构）:"+form);
		Pagination page = new Pagination(request);
		SysUser user = (SysUser) request.getSession().getAttribute(Constants.USERINFO);
		String hospCode = ((HospInfo) user.getInfo()).getHospCode();
		form.setHospCode(hospCode);
		form.setUserId(user.getId());
		page.setForm(form);
		page = purReturnOrderManager.getReturnDrugApplyDataList(page);
		return page;
	}

	/**
	 * 
	 * @category 加入退货计划 （医疗机构）
	 * @author 韩守松
	 * @date 2015年12月1日 
	 * @param array
	 * @return
	 */
	@RequestMapping("/joinReturnPlan")
	@ResponseBody
	public Pagination joinReturnPlan(String array) {
		Pagination page = new Pagination(request);
		if (array != null && !"".equals(array)) {
			Gson gson = new Gson();
			Type type = new TypeToken<List<ReturnDrugForm>>() {
			}.getType();
			List<ReturnDrugForm> list = gson.fromJson(array, type);
			SysUser user = (SysUser) request.getSession().getAttribute(
					Constants.USERINFO);
			HospInfo hospinfo = (HospInfo) user.getInfo();
			if (list != null && !list.isEmpty()) {
				List<ReturnDrugForm> returnDrugList = new ArrayList<ReturnDrugForm>();
				for (int i=0;i<list.size();i++) {
					ReturnDrugForm form = list.get(i);
					if (!ValidatorUtil.validatePositiveInteger(form
							.getRetCount())) {
						page.setSuccess(false);
						page.setMsg("请正确填退货数量！");
						return page;
					}
					PurAoginfo data = purReturnOrderManager.getAoginfoById(form
							.getRecpInfoId());
					if ((data.getTotalAmount() - data.getReturnCount()) < ParseNumber.toInteger(form
							.getRetCount())) {
						page.setSuccess(false);
						page.setMsg("退货数量不能大于可退货数量！");
						return page;
					}
					
					form.setHospCode(hospinfo.getHospCode());
					form.setHospName(hospinfo.getHospName());
					form.setHospSpelCode(hospinfo.getHospSpelCode());
					form.setHospStatus(hospinfo.getStatus());
					form.setHospAreaId(hospinfo.getArea().getAreaid());
					form.setHospAreaName(hospinfo.getArea().getAreaname());
					form.setHospArShortname(hospinfo.getArea().getArshortname());
					form.setHospArFullname(hospinfo.getArea().getArfullname());
					form.setUpdUser(user.getId());
					form.setJoinRetUser(user.getId());
					returnDrugList.add(i,form);
				}
				try {
					purReturnOrderManager.joinReturnPlan(returnDrugList);
					page.setSuccess(true);
				} catch (Exception e) {
					e.printStackTrace();
					page.setSuccess(false);
					page.setMsg("操作失败，请联系管理员！");
					return page;
				}
			}
		}
		return page;
	}

	/**
	 * 
	 * @category 跳向制定退货单页面（医疗机构）
	 * @author 韩守松
	 * @date 2015年12月1日 
	 * @return
	 */
	@RequestMapping("/toReturnDrugPlan")
	public String toReturnDrugPlan() {
		return "/trading/pur/returnDrugPlan";
	}

	/**
	 * 
	 * @category 获取可制定退货单计划列表数据（医疗机构）
	 * @author 韩守松
	 * @date 2015年12月1日
	 * @return
	 */
	@RequestMapping("/getReturnDrugPlanDataList")
	@ResponseBody
	public Pagination getReturnDrugPlanDataList(ReturnDrugForm form) {
		Pagination page = new Pagination(request);
		SysUser user = (SysUser) request.getSession().getAttribute(
				Constants.USERINFO);
		String hospCode = ((HospInfo) user.getInfo()).getHospCode();
		form.setHospCode(hospCode);
		form.setUserId(user.getId());
		page.setForm(form);
		page = purReturnOrderManager.getReturnDrugPlanDataList(page);
		return page;
	}

	/**
	 * 
	 * @category 删除退货计划（医疗机构）
	 * @author 韩守松
	 * @date 2015年12月2日
	 * @param array
	 * @return
	 */
	@RequestMapping("/deleteReturnPlan")
	@ResponseBody
	public Pagination deleteReturnPlan(String array) {
		log.info("删除退货计划（医疗机构）:"+array);
		Pagination page = new Pagination(request);
		if (array != null && !"".equals(array)) {
			Gson gson = new Gson();
			Type type = new TypeToken<List<ReturnDrugForm>>() {
			}.getType();
			List<ReturnDrugForm> list = gson.fromJson(array, type);
			if (list != null && !list.isEmpty()) {
				try {
					purReturnOrderManager.deleteReturnPlan(list);
					page.setSuccess(true);
				} catch (Exception e) {
					e.printStackTrace();
					page.setSuccess(false);
					page.setMsg("操作失败，请联系管理员！");
					return page;
				}
			} else {
				page.setSuccess(false);
				page.setMsg("请勾选要删除的药品！");
				return page;
			}
		}
		return page;
	}

	/**
	 * 
	 * @category 保存退货计划（医疗机构）
	 * @author 邱磊
	 * @date 2015年7月16日 上午10:54:43
	 * @return
	 */
	@RequestMapping("/modifyReturnPlan")
	@ResponseBody
	public Pagination modifyReturnPlan(String array) {
		log.info("保存退货计划（医疗机构）:"+array);
		Pagination page = new Pagination(request);
		if (array != null && !"".equals(array)) {
			Gson gson = new Gson();
			Type type = new TypeToken<List<ReturnDrugForm>>() {
			}.getType();
			List<ReturnDrugForm> list = gson.fromJson(array, type);
			SysUser user = (SysUser) request.getSession().getAttribute(
					Constants.USERINFO);
			if (list != null && !list.isEmpty()) {
				for (ReturnDrugForm form : list) {
					if (!ValidatorUtil.validatePositiveInteger(form
							.getRetCount())) {
						page.setSuccess(false);
						page.setMsg("请正确填退货数量！");
						return page;
					}
					PurAoginfo data = purReturnOrderManager.getAoginfoById(form
							.getRecpInfoId());
					if (data.getTotalAmount() < ParseNumber.toInteger(form
							.getRetCount())) {
						page.setSuccess(false);
						page.setMsg("退货数量不能大于到货数量！");
						return page;
					}
					form.setUpdUser(user.getId());
				}
				try {
					purReturnOrderManager.modifyReturnPlan(list);
					page.setSuccess(true);
				} catch (Exception e) {
					e.printStackTrace();
					page.setSuccess(false);
					page.setMsg("操作失败，请联系管理员！");
					return page;
				}
			}
		}
		return page;
	}

	/**
	 * 
	 * @category 生成退货单（医疗机构）
	 * @author 韩守松
	 * @date 2015年12月2日 
	 * @param array
	 * @return
	 */
	@RequestMapping("/createReturnInfo")
	@ResponseBody
	public Pagination createReturnInfo(ReturnDrugForm form) {
		log.info("生成退货单（医疗机构）:"+form);
		Pagination page = new Pagination(request);
		SysUser user = (SysUser) request.getSession().getAttribute(
				Constants.USERINFO);
		HospInfo hospinfo = (HospInfo)user.getInfo();
		form.setHospCode(hospinfo.getHospCode());
		form.setHospName(hospinfo.getHospName());
		form.setHospSpelCode(hospinfo.getHospSpelCode());
		form.setHospStatus(hospinfo.getStatus());
		form.setHospAreaId(hospinfo.getArea().getAreaid());
		form.setHospAreaName(hospinfo.getArea().getAreaname());
		form.setHospArShortname(hospinfo.getArea().getArshortname());
		form.setHospArFullname(hospinfo.getArea().getArfullname());
		form.setUpdUser(user.getId());
		form.setSubmitUser(user.getId());
		try {
			purReturnOrderManager.createReturnInfo(form);
			page.setSuccess(true);
		} catch (Exception e) {
			e.printStackTrace();
			page.setSuccess(false);
			page.setMsg("操作失败，请联系管理员！");
			return page;
		}
		return page;
	}
	/**
	 * 
	 *@category 跳向退货单查看页面（医疗机构）
	 *@author 邱磊
	 *@date 2015年7月16日 下午2:54:14
	 *@return
	 */
	@RequestMapping("/toHospReturnInfoList")
	public String toHospReturnInfoList(){
		return "/trading/pur/hospReturnInfo";
	}
	/**
	 * 
	 *@category 获取退货单列表数据（医疗机构）
	 *@author 邱磊
	 *@date 2015年7月16日 下午3:26:47
	 *@param form
	 *@return
	 */
	@RequestMapping("/getHospReturnInfoDataList")
	@ResponseBody
	public Pagination getHospReturnInfoDataList(ReturnOrder returnOrder){
		Pagination page = new Pagination(request);
		SysUser user = getUser();
		HospInfo hosp = user.getInfo();
		returnOrder.setHospCode(hosp.getHospCode());
		page.setForm(returnOrder);
		return purReturnOrderManager.getHospReturnInfoDataList(page);
	}
	/**
	 * 
	 *@category 跳向退货单详细列表页面（医疗机构）
	 *@author 邱磊
	 *@date 2015年7月16日 下午3:30:04
	 *@param retCode
	 *@return UnsupportedEncodingException 
	 */
	
	@RequestMapping("/toHospReturnInfoDetail")
	public String toHospReturnInfoDetail() throws UnsupportedEncodingException{
		request.setAttribute("delCompName", URLDecoder.decode(request.getParameter("delCompName"), "utf-8"));
		return "/trading/pur/hospReturnInfoDetail";
	}
	/**
	 * 
	 *@category 获取退货单详细列表页面数据（医疗机构）
	 *@author 邱磊
	 *@date 2015年7月16日 下午3:31:14
	 *@return
	 */
	@RequestMapping("/getHospReturnInfoDetailDataList")
	@ResponseBody
	public Pagination getHospReturnInfoDetailDataList(){
		Pagination page = new Pagination(request);
		page.getConditions().put("retCode", request.getParameter("retCode"));
		page.getConditions().put("drugCode", request.getParameter("drugCode"));
		page.getConditions().put("drugName", request.getParameter("drugName"));
		page.getConditions().put("compName", request.getParameter("compName"));
		page.getConditions().put("lotId", request.getParameter("lotId"));
		return purReturnOrderManager.getHospReturnInfoDetailDataList(page);
	}
}
